package com.woniuxy.controller;

import com.woniuxy.entity.VO.TypeCountVO;
import com.woniuxy.service.*;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author pml
 * @Date 2025/7/18 16:47
 * @Description TODO
 * 首页数据统计控制器
 * 集中处理所有仪表盘统计相关的API请求
 */
@RestController
@RequestMapping("/dashboard")
public class DashboardController {

    // 注入文章服务 - 用于获取内容总数和总浏览量
    @Autowired
    private IArticleService articleService;

    // 注入用户服务 - 用于获取总用户数
    @Autowired
    private IUserService userService;

    // 注入跑腿订单服务 - 用于获取跑腿订单数
    // 修正：之前错误注入IRoleService，现在使用正确的订单服务接口
    @Autowired
    private IOrderRunService orderRunService;

    // 注入商品服务 - 用于获取商品总数
    @Autowired
    private IShopService shopService;

    // 注入评论服务 - 用于获取总评论数
    @Autowired
    private IArticleCommentService articleCommentService;

    // 注入类型服务 - 用于获取内容类型分布
    @Autowired
    private ITypeService typeService;

    // 注入跑腿订单服务 - 用于获取订单状态分布
    @Autowired
    private IAllRunService allRunService;

    /**
     * 获取首页统计卡片数据
     * 严格按照需求实现六个核心指标，每个指标都对应指定的数据表和过滤条件
     */
    @GetMapping("/stats")
    public ResponseData<Map<String, Object>> getDashboardStats() {
        Map<String, Object> stats = new HashMap<>();

        // 1. 总用户数：all_user表记录总数（排除已删除用户）
        // 调用IUserService.countTotalUsers()实现，该方法已过滤is_deleted=0
        stats.put("totalUsers", userService.countTotalUsers());

        // 2. 内容总数：all_article表已发布内容(状态=2)
        // 调用IArticleService.countPublishedArticles()实现，内部已过滤status=2
        stats.put("totalContents", articleService.countPublishedArticles());

        // 3. 跑腿订单数：all_run表总订单
        // 调用IOrderRunService.getTotalOrderCount()实现，返回所有状态订单总数
        stats.put("totalOrders", orderRunService.getTotalOrderCount());

        // 4. 商品总数：all_shop表上架商品(状态=1)
        // 调用IShopService.countOnlineShops()实现，内部已过滤status=1
        stats.put("totalProducts", shopService.countOnlineShops());

        // 5. 总评论数：article_comment表记录总数
        // 调用IArticleCommentService.countTotalComments()实现，过滤is_deleted=0
        stats.put("totalComments", articleCommentService.countTotalComments());

        // 6. 总浏览量：all_article表view_count字段总和
        // 新增：调用IArticleService.sumTotalViewCount()实现，统计已发布文章的浏览量总和
        stats.put("totalViews", articleService.sumTotalViewCount());

        // 使用统一的ResponseData包装返回结果，与其他控制器保持一致
        return ResponseData.ok(stats);
    }

    /**
     * 获取内容类型分布统计
     */
    @GetMapping("/content-type-distribution")
    public ResponseData<List<TypeCountVO>> getContentTypeDistribution() {
        return ResponseData.ok(typeService.getTypeDistribution());
    }

    /**
     * 获取订单状态分布统计
     */
    @GetMapping("/order-status-distribution")
    public ResponseData<List<Map<String, Object>>> getOrderStatusDistribution() {
        return ResponseData.ok(allRunService.getOrderStatusDistribution());
    }

    /**
     * 获取用户增长趋势数据
     */
    @GetMapping("/user-growth-trend")
    public ResponseData<List<com.woniuxy.entity.DTO.UserGrowthDTO>> getUserGrowthTrend(
            @RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startDate,
            @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endDate) {
        return ResponseData.ok(userService.getUserGrowthTrend(startDate, endDate));
    }

    /**
     * 获取内容发布趋势数据
     */
    @GetMapping("/content-publish-trend")
    public ResponseData<List<Map<String, Object>>> getContentPublishTrend() {
        return ResponseData.ok(articleService.getPublishTrendByDate());
    }
}